/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */
package com.yami.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.bean.app.param.PayParam;
import com.yami.shop.bean.app.param.PayUserParam;
import com.yami.shop.bean.bo.PayInfoResultBO;
import com.yami.shop.bean.model.Order;
import com.yami.shop.bean.model.PayInfo;
import com.yami.shop.bean.param.CustomerReqParam;
import com.yami.shop.bean.pay.PayInfoDto;
import com.yami.shop.bean.vo.AccountDetailVO;
import com.yami.shop.bean.vo.ShopAccountDetailVO;
import com.yami.shop.bean.vo.ShopAccountVO;
import com.yami.shop.common.response.ServerResponseEntity;
import com.yami.shop.common.util.PageParam;

import java.util.Date;
import java.util.List;

/**
 * @author lgh on 2018/09/15.
 */
public interface PayInfoService extends IService<PayInfo> {


    /**
     * 调取微信 or 支付宝接口，创建支付订单，返回给前端，前端唤起应用进行支付
     * @param userId 用户id
     * @param payParam 支付参数
     * @return 支付信息
     */
    PayInfoDto pay(String userId, PayParam payParam);

    /**
     * 支付成功回调
     * @param payInfoResultBO 支付信息
     * @param orderNumberList 订单编号列表
     * @param payInfo 支付信息
     * @return 订单信息
     */
    List<Order> paySuccess(PayInfoResultBO payInfoResultBO, List<String> orderNumberList, PayInfo payInfo);

    /**
     * 进行vip购买，返回支付信息
     * @param userId 用户id
     * @param payUserParam 支付参数
     * @return 支付信息
     */
    PayInfoDto buyVip(String userId, PayUserParam payUserParam);

    /**
     * 调取微信 or 支付宝接口，创建充值订单，返回给前端，前端唤起应用进行支付
     * @param userId
     * @param payUserParam
     * @return
     */
    PayInfoDto recharge(String userId, PayUserParam payUserParam);

    /**
     * 支付回调
     * @param payInfoResultBO
     * @param payInfo
     * @return
     */
    ServerResponseEntity<String> noticeOrder(PayInfoResultBO payInfoResultBO, PayInfo payInfo);

    /**
     * 根据订单号主动查单
     *
     * @param orderNumbers 订单号
     * @param payEntry
     * @param userId
     */
    Integer queryPay(String orderNumbers, String userId, Integer payEntry);

    /**
     * 标记为退款状态
     * @param payNo 支付编号
     */
    void markerRefund(String payNo);

    /**
     * 根据时间参数获取收入账户详情
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param shopName 店铺名称
     * @return 收入账户详情
     */
    AccountDetailVO getIncomeAccountDetail(Date startTime, Date endTime, String shopName);

    /**
     * 根据时间参数分页获取收入账户详情
     * @param page
     * @param accountSearchDTO
     * @return
     */
    IPage<ShopAccountVO> pageIncomeAccountDetail(PageParam<ShopAccountVO> page, CustomerReqParam accountSearchDTO);

    /**
     * 根据参数分页获取收入账户详情
     * @param page
     * @param customerReqParam
     * @return
     */
    IPage<ShopAccountDetailVO> pageShopIncomeAccountDetail(PageParam<ShopAccountDetailVO> page, CustomerReqParam customerReqParam);

    /**
     * 根据参数获取收入详情列表
     * @param customerReqParam
     * @return
     */
    List<ShopAccountDetailVO> listIncomeAccountDetail(CustomerReqParam customerReqParam);
}
